//
// Created by wujehy on 2020/5/21.
//

#ifndef GEEJOAN_CURVE25519_H
#define GEEJOAN_CURVE25519_H



/**
 * @brief 密钥对功能封装 , GeeJoan 信息交换安全使用
 * @pre 依赖 Common 通用算法 集合
 */
#include <string>

#define  COMMON_KEY_PAIR_SIZE           32
#define  COMMON_SIGNATURE_SIZE          64
#define  COMMON_SIGNATURE_RAMDON_SIZE   64

namespace GeeJoan
{

    namespace Common
    {

        class KeyPairData
        {
        private:
            std::string m_publicKey;
            std::string m_privateKey;

        public:
            explicit KeyPairData(std::string serialize ="");
            /**
             * @brief 生成 公私钥对
             * @return
             */
            int generateKeyPair();

            /**
             * @brief 协商计算
             * @param out_shared_key
             * @param publiceKey 对方的公钥
             * @return
             */
            int Calculation(std::string &out_shared_key, std::string &publiceKey);

            /**
             * @brief 协商计算
             * @param[out] out_shared_key
             * @param[in] otherKeyPair 另一个密钥对
             * @return
             */
            int Calculation(std::string &out_shared_key, KeyPairData &otherKeyPair);

            /**
             * @brief 私钥签名
             * @param[out] signature_out 签名输出
             * @param[in] inMessage 需要签名的数据
             * @return
             */
            int Signature(std::string &signature_out, std::string &inMessage);

            /**
             * @brief 公钥验证签名 , 频繁 验证 会 失败
             * @param[in] signature
             * @param[in] public_key 签名的公钥
             * @param[in] inMessage
             * @return
             */
            static int Verify(std::string &signature, std::string &public_key, std::string &inMessage);

            const std::string &getMPublicKey() const;

            const std::string &getMPrivateKey() const;

            /**
             * @brief 获取 序列化后的密钥对
             * @return 序列化后的密钥对
             */
            std::string getSerializeKeyPair();
        };
    }

}
#endif //GEEJOAN_CURVE25519_H
